
; --------------版本一
assume cs:code,ds:data,ss:stack
data segment
	db 'welcome to masm!'  ;定义显示的字符串(16字节)
	db 02h,24h,71h		   ;定义三种颜色属性 
data ends
 
stack segment ;栈段用来存放cx做多重循环
	dw 8 dup(0)
stack ends
 
code segment
	start:
	; 数据段
	mov ax,data
	mov ds,ax
	; bx
	
	; 指向内存 b8720H:指向第一次字符内存区域
	mov ax,0b872h
	mov es,ax
	; bp
	

	; 栈段
	mov ax,stack
	mov ss,ax
	mov sp,16



	; 颜色段 同用ds但指针不同
	;ds:bx
	


	mov bx,0 ;颜色初始值
	mov cx,3
	mov bp,0 ;显存
	s0:
	mov dl,ds:[bx+16] ;颜色

	

	push cx
	push bx

	
	mov cx,16
	mov bx,0 ;数据

	s:

	; 取数据放在低地址
	mov al,ds:[bx]
	mov es:[bp],al


	; 取颜色放在高地址
	
	mov es:[bp+1],dl

	add bp,2
	add bx,1
	loop s

	pop bx
	pop cx

	add bp,128
	add bx,1
	loop s0


	mov ax,4c00h
	int 21h
 
code ends 
end start
; 对于寄存器直接想用就用，最后分析代码考虑重复一同pushpop


; ---------版本二
assume cs:code,ds:data,ss:stack
data segment
	db 'welcome to masm!'  ;定义显示的字符串(16字节)
	db 02h,24h,71h		   ;定义三种颜色属性 
data ends
 
stack segment ;栈段用来存放cx做多重循环
	dw 8 dup(0)
stack ends

code segment
	start:
	; 数据和颜色段
	mov ax,data
	mov ds,ax
	; 栈段
	mov ax,stack
	mov ss,ax
	mov sp,16

	; 显存
	mov ax,0b872h
	mov es,ax



	; for 3行 变量:颜色和显存位置
	mov bp,0
	mov bx,0
	mov cx,3
	; {
	s0:
	; 颜色
	mov, al,ds:[bx+16]
	; 显存位置
	mov bx,es:[bp]
		
		push bx
		push bp

		; for 16列 变量：字符位置，显存位置
		mov cx,16
		mov bx,0
		;{
		s1:
		ds:[bx]


		pop bp
		pop bx

		loop s1
		;}

	add bp,128
	inc bx
	loop s0
	;}




code ends 
end start